home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-1.iso
/
games
/
ted5.zip
/
TED5.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-20
|
64KB
|
2,780 lines
////////////////////////////////////////////////////
//
// TED 5
// MultiVideo mode, MultiTile size, MultiMap editor
// by John Romero (C) 1991 Id Software
//
// Development Log:
// -------------------------------------------------
// Mar 19 91 - Starting this thing! Getting it to
// compile with the JHUFF and MEM stuff.
//
// Mar 20 91 - Got the whole deal compiling and wrote
// the EGA drawchar routine and got most of
// Dialogs written!
//
// Mar 25 91 - Forgot some days in there! Got the XMS
// stuff going and started the big initialization
// part. Past init will be lots easier!
//
// Mar 30 91 - Got map selection and dimensioning and
// allocation done. Added more MENU abilities to
// allow more flexible dialogs.
//
// Apr 7 91 - Got project initialization done. Got
// tiles into XMS. Wrote XMS routines for all
// memory functions needed.
//
// Apr 12 91 - FINALLY got the maps loading and saving
// correctly - NO THANKS TO MR.C OVER THERE! You
// see, he can't remember whether his expansion
// routines use the compressed or expanded length
// and that was causing me quite a problem. Got
// it solved and the map shuffling shit works
// PERFECTLY now! Got tile select in, map stats,
// and other stuff...
//
// Apr 19 91 - Got all 3 planes working (drawing,etc.)
// TileSelect screens jam...lots of little options
// thrown in... !!! I got my '75 Cougar !!!
//
// Apr 25 91 - Got map dimension changing done! Fixed
// some small bugs...had a WHOPPER of a fucking
// bug today ... I was overwriting the stack
// when the first background save happened. I'm SURE
// I allocated enough memory -- I don't know...
//
// Apr 27 91 - Map Edge Select works (for Copy) & now I
// draw a frame around the entire region.
//
// May 01 91 - Added a nice feature - retaining the Copy
// buffer wherever it may get toasted. Used XMS so
// I didn't chew mainmem. Also made it so you can
// turn the plane READ/WRITEs ON/OFF (obvious advantage).
// Got Copy/Paste from everywhere with FloatingPaste!
//
// May 03 91 - Got entering values for infoplane stuff & all
// that shit encompasses. Trying to get a cursor drawn
// (with backgrnd save/restore) in CGA & EGA3 modes.
// Wish me luck! ... FUCK IT! I removed EGA3 mode -- it
// was too much shit & kludgery to get a cursor going.
//
// May 08 91 - Well! Let's see...I got Huffman map compression
// done; wrote a MakeOBJ function that can be used within
// the Memory Manager or Standard Borland C. Added .OBJ
// generation to IGRAB. Started the function to generate
// graphic map dumps. Modified the MapHeader stuff more
// when John needed "extras".
//
// May 09 91 - Finished ILBM & Apple Preferred map dumps!
// Fixed a couple hidden bugs, made some things nicer,
// started on Flood Fill...
//
// May 11 91 - Got the TILEINFO/M stuff structured and loading
// and saving (with compression). Putting all the "hidden"
// commands in the menus...
//
// May 13 91 - Stuck in a PROJECT SELECT option (for the Keen2
// trilogy, it'll be nice).
//
// May 16 91 - Got all of TILEINFO stuff finished. Tom and
// Jason's first day! Tom BETAed IGRAB & TED5 big time.
// Had to basically dump the GraphHeaderStr and just
// make the ?GAHEAD.ext file all dataoffsets! (The simpler,
// the better!)
//
// May 19 91 - Almost got the Flood Fill mode working...Tom
// started drawing maps a little early & now I need to add
// a little kludge-fix to reformat his old maps...
//
// May 22 91 - Got AWESOME UNDO working ... fixed the nagging little
// paste/scrolling bug fixed (separated the PasteErase
// & PasteDraw routines) ... finished Block Fill ... fixed
// the floating paste/tile showthru bug ...
//
// May 27 91 - Basically finished up. Tom is BETAing now. I need
// to make SelectMap accept the arrows & make an array for
// the map names instead of the sorry way I'm doing it now.
//
// Jun 2 91 - Got level launching working! Been working on
// TED5 and IGRAB docs and MUSE most of the time.
//
// Jun 18 91 - v0.13 because John C.'s system didn't have
// the SCmapmask set to 15 in CopyEGA!
//
// Jun 20 91 - v0.14: It's annoying to LAUNCH the game and come
// back at the top-left corner!
//
// Jun 26 91 - v0.17: Made LAUNCH with ICON CHANGE ctrl-alt-L
// because Tomshit was having problems...adding Unused Tile
// Scan...fixing a couple minor Tom-irritants...
//
// Jul 12 91 - v0.23: Made VGA & CGA work! Fixed a small
// bug with plane-on starting...added a GridMode for the
// FloatingPaste...XMS Map-Cache...now saves the Launchname
// in TEDINFO? so user program doesn't need to send anything
// back but /LAUNCHED...finally fixed nagging FloatingPaste
// multi-plane viewing bug...
//
// Jul 19 91 - v0.24: Changed TEDINFO structure and added GFXINFO
// to IGRAB. Got most all bugs out...lowercase input now...
//
// Jul 23 91 - v0.26: Only write out .H if it needs to...got the
// SnapPaste feature in that Tom wanted...
//
// Aug 08 91 - v0.28: I can't believe this shit! Mr. Tom decided
// to enter the value "0xF00D" into the map, which was my secret
// value for passing an ESC press back from "inputint". I made
// it a #define now!
//
// Aug 09 91 - v0.29: I FUCKING FRIED THE LIB_A.ASM & LIB.C FILES!
// THESE USED TO HOLD TED5'S TILE-DRAWING AND CGA/VGA ROUTINES!
// AAAARRRRGGGG!!!! Trying to recontruct the program. It'll
// take a bit (I was trying to fix a bug in EditMapNames).
//
// Aug 14 91 - v0.30: Just got finished fixing the FRIED SOURCE HELL!
//
// Aug 16 91 - v0.31: Heh heh, I added the ViewMap function!
//
// Aug 19 91 - v0.32: Added the MapImport function and it works! YES!
//
// Aug 22-23 - v0.35: Fixed a WHOLE BUNCH of little things and added
// some cool features like easier TILEINFO entering, default
// Import drive, F3 to toggle Paste Overlay, etc. Very nice now.
//
// Aug 24 91 - v0.38: Fixed a bug in passing multiple command-line
// parameters to LAUNCHed program. Let user enter new parms and
// a new launch name while in TED5. Added the CarmackCompression
// and trashed the Huffman shit.
//
// Sep 07 91 - v0.40: Only ViewMap planes viewable instead of all; flag
// currently loaded map in SelectMap dialog; check NumIconRows for
// a bogus value for old TED5 compatibility; show map dimensions in
// ChangeMapEdges dialog; CTRL-ALT-arrows will go to map edges.
//
// Sep 12 91 - v0.41: Let user PERMANENTLY change the Launch icon. Also,
// the plane flags are always saved!
//
// Sep 27 91 - v0.43: Added REVIEW_MAP function. Fixed a hard-to-find bug
// in the BlockFill-with-pattern function.
//
// Sep 29 91 - v0.44: Fixed small annoying bug w/Flood-fill w/pattern.
//
// Oct 12 91 - v0.45: Added the PrintReport feature after Carmacizing
// all the maps.
//
// Nov 24 91 - v0.48: Saving the Import Path, added TILEINFOM copying
// from one area to another, getting rid of the "turning the plane
// viewing ON automatically sets it for writing."
//
// May 22 92 - v0.49: Added graphics-select switch to get rid of a dialog.
//
// Oct 20 95 - v0.50: Fixed EGA scrolling bug, added screensaver which comes
// on automatically after 2 minutes. Timelimit adjustable
// through TIMELIMIT command line MED
//
////////////////////////////////////////////////////
#include "ted5.h"
#pragma hdrstop
extern unsigned _stklen=0x2000;
////////////////////////////////////////////////////
//
// Variables
//
////////////////////////////////////////////////////
extern char far TEDCHAR,far VGAPAL,tdata;
extern unsigned doubled[256];
UndoStr UndoRegion;
CopyStr TileCopy;
MapFileHeaderStr _seg *MapFileHeader;
char _seg *Tinfo[10],_seg *TMinfo[10],_seg *GraphHeader;
long _seg *XMSlookup,_seg *EgaXMSlookup,_seg *CgaXMSlookup,_seg *VgaXMSlookup;
int _seg *MapBkgnd,_seg *MapFrgnd,_seg *MapInfoPl,
_seg *CutBkgnd,_seg *CutFrgnd,_seg *CutInfoPl;
MapHeaderStr MapHeader;
TempStruct LaunchInfo;
InfoStruct _seg *TEDInfo;
GfxStruct _seg *GFXInfo;
video lastvideo,videomode;
screentype whichscreen=TILES;
VMapStr VMapData;
char launchname[64],ext[4],format[2],projname[64],mapname[64],planes,
infoname[64],mapheadname[64],MapNames[100][16],parmstring[64];
char SM_name[64],SM_loadname[64],BkgndColor,GfxToUse;
unsigned temp,whichmap,numtplanes,tilenum,tilemnum,numtmplanes,left,
DirtyFlag,tilelen,tilemlen,whicht,whichtm,whichi,
tsize,infoy,infomaxw,mapwidth,mapheight,screenw,usingbat,
screenh,planeton,planemon,planeion,maxiconrows,lasticon,firsticon,
viewton,viewmon,viewion,XMSundoB,XMSundoF,XMSundoI,launched,
XMSmaps,EgaXMS,CgaXMS,VgaXMS,xmshandle,GridMode,SnapMode,snapx,
snapy,snapxsize,snapysize,writeH,NoAbout,F3_flag;
int tilebase=0,tilembase=0,infobaron=1,xbase,ybase,scrnbot,scrnrgt,
FillMode=0,PasteMode=0,SelectMode=0,SelX1=-1,SelY1=-1,PasteOK=0,SelX2=-1,
SelY2=-1,pixelx,pixely,selectcols,px,py,lastmap=-1,TIybase,TIymbase,TIxbase,
TIxmbase,BfillMode,Plotting,TsearchMode,NoXMSFlag;
long CgaXMSsize,EgaXMSsize,VgaXMSsize;
long tics, tictime=1092L*2L;
//
// harderr-called routine
//
int ignore(void)
{
hardresume(0);
return 0;
}
////////////////////////////////////////////////////
//
// Start of The Beast From Hell
//
////////////////////////////////////////////////////
void main(void)
{
ParseCmdline();
SetupKBD();
MMStartup();
setvideo(EGA1);
lastvideo=EGA1;
InitTed5();
harderr(ignore);
tics=biostime(0,0);
DeskEventLoop(HandleEvent,Continuous);
}
////////////////////////////////////////////////////
//
// Parse the commandline
//
////////////////////////////////////////////////////
void ParseCmdline(void)
{
int i;
for (i=1;i<_argc;i++)
{
_argv[i]=strupr(_argv[i]);
if (_argv[i][0]=='-' || _argv[i][0]=='/')
_argv[i]++;
if (!strcmp(_argv[i],"?"))
{
printf(TITLESTR" by John Romero (C) 1991 Id Software, Inc.\n\n");
printf("Command Line parameters:\n");
printf("/? : gets this stuff\n");
printf("/EXT=??? : set the project extension\n");
printf("<filename> : set the Launch filename\n");
printf("/PARMS=<string> : set parms to Launch with\n");
printf("/NOXMSMAPS : don't cache maps in XMS\n");
printf("/GFX=??? : set gfx to use - E,C,V\n");
printf("/TIME=??? : half-minutes until screenblanker (default 2 minutes)\n");
exit(0);
}
else
if (!strncmp(_argv[i],"EXT=",4))
strcpy(ext,&_argv[i][4]);
else
if (!strncmp(_argv[i],"GFX=",4))
GfxToUse = _argv[i][4];
else
if (!strcmp(_argv[i],"LAUNCH"))
launched=1;
else
if (!strcmp(_argv[i],"BAT"))
usingbat=1;
else
if (!strncmp(_argv[i],"PARMS=",6))
strcpy(parmstring,&_argv[i][6]);
else
if (!strncmp(_argv[i],"TIME=",5))
tictime=(atol(&_argv[i][5]))*546L;
else
if (!strcmp(_argv[i],"NOXMSMAPS"))
NoXMSFlag=1;
else
if (!strcmp(_argv[i],"NOABOUT"))
NoAbout=1;
else
strcpy(launchname,_argv[i]);
}
}
////////////////////////////////////////////////////
//
// Event handler - called when button is pressed
// outside menu bar
//
////////////////////////////////////////////////////
void HandleEvent(void)
{
int pixelx,pixely,mx,my,b0,b1;
unsigned loc;
b0=MouseButton()&1;
b1=(MouseButton()>>1)&1;
MouseCoords(&mx,&my);
pixely=my;
pixelx=mx;
//
// PLOT OR PICK-UP TILE
//
if (my>=8 && my<infoy*8 && (b0 || b1))
{
mx=xbase+(mx>>(tsize+2));
my=ybase+((my-8)>>(tsize+2));
loc=my*mapwidth+mx;
if (mx>=mapwidth || my>=mapheight)
errsound();
else
{
if (b1)
{
//
// SELECT BOTTOM-RIGHT EDGE
//
if (SelectMode || BfillMode)
{
SelX2=mx;
SelY2=my;
if ((SelX1==-1 && SelY1==-1) ||
(SelX2<SelX1 || SelY2<SelY1))
{
SelX1=mx;
SelY1=my;
}
DrawMap();
sound(2000);
}
//
// FLOOD FILL!
//
else
if (FillMode)
{
while(MouseButton());
DoFloodFill(mx,my,1);
}
//
// PICK UP TILE(S)
//
else
{
if (planeton)
whicht=*(MapBkgnd+loc);
if (planemon)
whichtm=*(MapFrgnd+loc)+tilenum;
if (planeion)
whichi=*(MapInfoPl+loc)+tilenum;
DrawInfoBar();
//
// IF WE'RE IN TILESEARCH MODE, SHOW IT!
//
if (TsearchMode)
DrawMap();
}
while(MouseButton()>>1);
nosound();
}
if (b0)
{
//
// SELECT TOP-LEFT EDGE
//
if (SelectMode || BfillMode)
{
SelX1=mx;
SelY1=my;
if ((SelX2==-1 && SelY2==-1) ||
(SelX1>SelX2 || SelY1>SelY2))
{
SelX2=mx;
SelY2=my;
}
DrawMap();
sound(2000);
while(MouseButton());
}
//
// FLOOD FILL!
//
else
if (FillMode)
{
while(MouseButton());
DoFloodFill(mx,my,0);
}
//
// PASTE A CHUNK O' TILES/MAP
//
else
if (PasteMode)
{
if (TileCopy.MapOrTileSelect) // TILE-SELECT AREA?
{
int i,j;
if (SnapMode)
{
mx=(mx/snapxsize)*snapxsize+snapx;
my=(my/snapysize)*snapysize+snapy;
}
if (mx+TileCopy.w>mapwidth ||
my+TileCopy.h>mapheight)
sound(500);
else
{
CopyUndoRegion();
UndoRegion.x=mx;
UndoRegion.y=my;
UndoRegion.w=TileCopy.w;
UndoRegion.h=TileCopy.h;
sound(500);
switch(TileCopy.MapOrTileSelect)
{
case 1: // TILES
for (j=0;j<TileCopy.h;j++)
for (i=0;i<TileCopy.w;i++)
{
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i;
if (XMSlookup[val]!=-1)
MapBkgnd[(my+j)*mapwidth+mx+i]=val;
}
break;
case 2: // MASKED
for (j=0;j<TileCopy.h;j++)
for (i=0;i<TileCopy.w;i++)
{
int val=(j+TileCopy.y)*selectcols+TileCopy.x+i+tilenum+maxiconrows*selectcols;
if (XMSlookup[val]!=-1)
MapFrgnd[(my+j)*mapwidth+mx+i]=val-tilenum;
}
}
nosound();
DrawMap();
DirtyFlag=1;
}
while(MouseButton());
nosound();
}
else
{
int i,j;
if (SnapMode)
{
mx=(mx/snapxsize)*snapxsize+snapx;
my=(my/snapysize)*snapysize+snapy;
}
if (mx+TileCopy.w-1<mapwidth && my+TileCopy.h-1<mapheight)
{
sound(500);
CopyUndoRegion();
UndoRegion.x=mx;
UndoRegion.y=my;
UndoRegion.w=TileCopy.w;
UndoRegion.h=TileCopy.h;
for (j=0;j<TileCopy.h;j++)
for (i=0;i<TileCopy.w;i++)
{
int theM,theI;
if (TileCopy.PlanesCopied&BPLANE)
MapBkgnd[(j+my)*mapwidth+mx+i]=
CutBkgnd[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
if (TileCopy.PlanesCopied&FPLANE)
{
theM=CutFrgnd[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
if (theM || F3_flag)
MapFrgnd[(j+my)*mapwidth+mx+i]=theM;
}
if (TileCopy.PlanesCopied&IPLANE)
{
theI=CutInfoPl[(j+TileCopy.y)*mapwidth+TileCopy.x+i];
if (theI || F3_flag)
MapInfoPl[(j+my)*mapwidth+mx+i]=theI;
}
}
nosound();
DrawMap();
DirtyFlag=1;
}
else
sound(500);
while(MouseButton());
}
}
//
// PLOT TILE(S)
//
else
{
unsigned oldt,oldm,oldi;
//
// ARE WE STARTING THE PLOTTING REGION?
//
if (!Plotting)
{
CopyUndoRegion();
UndoRegion.x=mx;
UndoRegion.y=my;
UndoRegion.w=UndoRegion.h=1;
Plotting=1;
}
//
// FLOAT THE PLOTTING REGION
//
if (mx<UndoRegion.x)
UndoRegion.x=mx;
if (my<UndoRegion.y)
UndoRegion.y=my;
if (mx+1>UndoRegion.x+UndoRegion.w)
UndoRegion.w=mx-UndoRegion.x+1;
if (my+1>UndoRegion.y+UndoRegion.h)
UndoRegion.h=my-UndoRegion.y+1;
if (planeton)
*(MapBkgnd+loc)=whicht;
if (planemon)
*(MapFrgnd+loc)=whichtm-tilenum;
if (planeion)
*(MapInfoPl+loc)=whichi-tilenum;
oldt=MapBkgnd[loc];
oldm=MapFrgnd[loc]+tilenum;
oldi=MapInfoPl[loc]+tilenum;
CombineTiles(viewton?oldt:-BkgndColor,viewmon*oldm,oldi*viewion,tsize);
if (GridMode)
Overlay(tsize);
MouseHide();
DrawTile((mx-xbase)<<(tsize-1),(my-ybase)*(4<<tsize)+8,tsize);
CheckInfoValues(mx-xbase,my-ybase,oldi);
MouseShow();
DirtyFlag=1;
}
}
nosound();
}
}
//
// CLICK ON TILES
//
if (b0 && pixely>infoy*8)
{
if (pixelx<7*8)
SelectTiles(1);
else
if (pixelx<8*14 && tilemnum)
SelectTiles(2);
else
if (pixelx<8*20 && tilemnum)
SelectTiles(3);
}
}
#define PEL_WRITE_ADR 0x3c8
#define PEL_READ_ADR 0x3c7
#define PEL_DATA 0x3c9
#define PEL_MASK 0x3c6
void ScreenBlank ( void )
{
int done;
int x;
int y;
int r;
int g;
int b;
int c;
int oldx,oldy;
int i, j;
int xdir,ydir;
int cury;
int size;
int type;
struct {
int x,y;
} snake[256];
unsigned char far * screen=(unsigned char far *)0xa0000000l;
randomize();
_AX=0x13;
asm int 10h
done=0;
size=random(10)+2;
clearkeys();
for (i=255;i>=0;i--)
{
snake[i].x=160;
snake[i].y=100;
}
type=random(11);
r=random(200)+56;
g=random(200)+56;
b=random(200)+56;
outp (PEL_WRITE_ADR,0);
for (i=0;i<=255;i++)
{
outp (PEL_DATA, (unsigned char)((i*r)>>10));
outp (PEL_DATA, (unsigned char)((i*g)>>10));
outp (PEL_DATA, (unsigned char)((i*b)>>10));
}
xdir=0;
while (!xdir)
xdir=random(size<<1)-size;
ydir=0;
while (!ydir)
ydir=random(size<<1)-size;
while (!done)
{
if ((random(100)-80)>0)
{
xdir+=random(3)-1;
ydir+=random(3)-1;
}
for (i=255;i>0;i--)
snake[i]=snake[i-1];
snake[0].x+=xdir;
snake[0].y+=ydir;
if ((snake[0].x<size+1) || (snake[0].x>320-(size+1)))
{
xdir=-xdir;
snake[0].x+=xdir<<1;
}
else if (abs(xdir)>size-1)
xdir=-(xdir>>1);
if ((snake[0].y<size+1) || (snake[0].y>200-(size+1)))
{
ydir=-ydir;
snake[0].y+=ydir<<1;
}
else if (abs(ydir)>size-1)
ydir=-(ydir>>1);
for (x=255;x>=0;x--)
{
if (type<7)
{
for (j=snake[x].y,cury=320*snake[x].y;j<snake[x].y+size;j++,cury+=320)
_fmemset((screen+cury+snake[x].x),255-x,size);
}
else
{
_fmemset((screen+(320*snake[x].y)+snake[x].x),255-x,size);
}
}
oldx=pixelx;
oldy=pixely;
MouseCoords(&pixelx,&pixely);
if ((oldx!=pixelx) || (oldy!=pixely))
done=1;
for (x=0;x<127;x++)
if (keydown[x])
done=1;
}
}
////////////////////////////////////////////////////
//
// Routine called continuously by DeskEventLoop
//
////////////////////////////////////////////////////
void Continuous(void)
{
static int oldx, oldy;
if (biostime(0,0)-tics>tictime)
{
MouseHide();
ScreenBlank();
clearkeys();
videomode=lastvideo;
Item_ModeSwitch();
RedrawDesktop();
DrawMap();
DrawInfoBar();
MouseShow();
tics=biostime(0,0);
}
oldx=pixelx;
oldy=pixely;
MouseCoords(&pixelx,&pixely);
if ((oldx!=pixelx) || (oldy!=pixely))
{
tics=biostime(0,0);
PrintCoords();
}
if (!MouseButton())
Plotting=0;
//
// PLANE "WRITE" SELECTION
//
if (keydown[2] && viewton)
{
planeton^=1;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[2]);
}
if (keydown[3] && tilemnum && (MapFileHeader->maptype&FPLANE) && viewmon)
{
planemon^=1;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[3]);
}
if (keydown[4] && (MapFileHeader->maptype&IPLANE) && viewion)
{
planeion^=1;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[4]);
}
//
// PLANE "VIEW" SELECTION
//
if (keydown[5])
{
viewton^=1;
if (!viewton)
planeton=0;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[5]);
}
if (keydown[6] && tilemnum && (MapFileHeader->maptype&FPLANE))
{
viewmon^=1;
if (!viewmon)
planemon=0;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[6]);
}
if (keydown[7] && (MapFileHeader->maptype&IPLANE))
{
viewion^=1;
if (!viewion)
planeion=0;
DrawInfoBar();
DrawMap();
PrintCoords();
tics=biostime(0,0);
while(keydown[7]);
}
//
// Cancel COPY or PASTE or FLOOD FILL or BLOCK FILL
//
if (keydown[1] && (PasteMode || SelectMode || FillMode ||
BfillMode || TsearchMode))
{
while(keydown[1]);
if (PasteMode)
{
EraseFloatPaste();
px=py=-1;
}
SnapMode=TsearchMode=BfillMode=FillMode=PasteMode=SelectMode=0;
SelX1=SelX2=SelY1=SelY2=-1;
DrawMap();
DrawInfoBar();
tics=biostime(0,0);
}
//
// END OF COPY || BLOCK FILL
//
if (keydown[0x1c] && (SelectMode || BfillMode))
{
int temp,j,i;
tics=biostime(0,0);
while(keydown[0x1c]);
if (SelX2<SelX1)
{
temp=SelX1;
SelX1=SelX2;
SelX2=temp;
}
if (SelY2<SelY1)
{
temp=SelY1;
SelY1=SelY2;
SelY2=temp;
}
//
// BLOCK FILL?
//
if (BfillMode)
{
BfillMode=0;
DrawInfoBar();
DoBlockFill();
SelX1=SelX2=SelY1=SelY2=-1;
}
else
//
// COPY MODE?
//
if (SelectMode)
{
SelectMode=0;
TileCopy.x=SelX1;
TileCopy.y=SelY1;
TileCopy.w=SelX2-SelX1+1;
TileCopy.h=SelY2-SelY1+1;
TileCopy.MapOrTileSelect=0;
TileCopy.PlanesCopied=planeton*BPLANE | planemon*FPLANE | planeion*IPLANE;
//
// DO THE COPY!
//
sound(600);
for (j=SelY1;j<=SelY2;j++)
for (i=SelX1;i<=SelX2;i++)
{
if (planeton)
CutBkgnd[j*mapwidth+i]=MapBkgnd[j*mapwidth+i];
if (planemon)
CutFrgnd[j*mapwidth+i]=MapFrgnd[j*mapwidth+i];
if (planeion)
CutInfoPl[j*mapwidth+i]=MapInfoPl[j*mapwidth+i];
}
DrawInfoBar();
SelX1=SelX2=SelY1=SelY2=-1;
PasteOK=1;
px=py=-1;
nosound();
DrawMap();
}
clearkeys();
}
//
// See if we want to scroll the map!
//
CheckMapScroll();
CheckFloatPaste((pixelx>>(tsize+2))+xbase,((pixely-8)>>(tsize+2))+ybase);
}
////////////////////////////////////////////////////
//
// Draw the current map on the screen at xbase,ybase
//
////////////////////////////////////////////////////
void DrawMap(void)
{
int i,j,imax,jmax;
EraseFloatPaste();
jmax=screenh;
if (jmax>mapheight)
jmax=mapheight;
imax=screenw;
if (imax>mapwidth)
imax=mapwidth;
MouseHide();
for(j=0;j<jmax;j++)
for(i=0;i<imax;i++)
{
unsigned tilet,tilem,tilei,loc;
loc=(ybase+j)*mapwidth+xbase+i;
tilet=*(MapBkgnd+loc);
tilem=*(MapFrgnd+loc)+tilenum;
tilei=*(MapInfoPl+loc)+tilenum;
CombineTiles(tilet*viewton-BkgndColor*(!viewton),tilem*viewmon,tilei*viewion,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i<<(tsize-1),j*(4<<tsize)+8,tsize);
CheckInfoValues(i,j,tilei);
CheckSelectEdges(i+xbase,j+ybase,i,j);
}
MouseShow();
DrawFloatPaste();
}
////////////////////////////////////////////////////
//
// Figure out SCREENW,SCREENH from videomode & tsize
//
////////////////////////////////////////////////////
void FigureScreenEdges(void)
{
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
screenw=40>>(tsize-1);
screenh=22>>(tsize-1);
break;
case EGA2:
screenw=80>>(tsize-1);
screenh=57>>(tsize-1);
break;
}
if (!infobaron)
{
infoy=100; // WAY OFF THE BOTTOM!
screenh+=2*(tsize==1)+(tsize==2);
}
}
////////////////////////////////////////////////////
//
// Print the coords on the INFOBAR
//
////////////////////////////////////////////////////
void PrintCoords(void)
{
static zeroed=0;
int mx,my;
if (!infobaron)
return;
xormask=0;
MouseCoords(&mx,&my);
if (my<8 || my>=infoy*8)
{
if (zeroed)
return;
sx=infomaxw-9;
sy=infoy;
print("??? ?????");
sx=infomaxw-9;
sy=infoy+1;
print("??? ?????");
zeroed=1;
return;
}
zeroed=0;
mx=mx>>(tsize+2);
sx=infomaxw-9;
sy=infoy;
printint(mx+xbase);
print(" ");
sx=infomaxw-5;
printhex(mx+xbase);
my=(my-8)>>(tsize+2);
sx=infomaxw-9;
sy=infoy+1;
printint(my+ybase);
print(" ");
sx=infomaxw-5;
printhex(my+ybase);
}
////////////////////////////////////////////////////
//
// Draw the INFOBAR
//
////////////////////////////////////////////////////
void DrawInfoBar(void)
{
int ox,oy;
if (PasteMode)
{
px=py=-1;
CheckFloatPaste((pixelx>>(tsize+2))+xbase,((pixely-8)>>(tsize+2))+ybase);
}
if (!infobaron)
return;
EraseFloatPaste();
ox=sx=0;
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
oy=sy=23-2*(tsize==3);
infomaxw=40;
break;
case EGA2:
oy=sy=58-2*(tsize==3)-1*(tsize==2);
infomaxw=80;
}
MouseHide();
infoy=oy;
bar(0,infoy,infomaxw-1,infoy+1,' ');
if (SelectMode)
{
sx=leftedge=1;
sy=infoy;
print("Copy Mode\nESC to exit");
}
else
if (TsearchMode)
{
sx=leftedge=1;
sy=infoy;
print("Tile Search Mode\nESC to exit");
}
else
if (BfillMode)
{
sx=leftedge=1;
sy=infoy;
print("Block Fill Mode\nESC to exit");
}
else
if (PasteMode)
{
sx=leftedge=1;
sy=infoy;
print("Paste Mode\nESC to exit");
}
else
if (FillMode)
{
sx=leftedge=1;
sy=infoy;
print("Flood Fill Mode\nESC to exit");
}
else
{
CombineTiles(whicht,0,0,tsize);
DrawTile(ox,oy*8+8*(tsize==1),tsize);
sx=ox+2+2*(tsize==3);
sy=oy;
printhex(whicht);
sx-=5;
sy++;
printint(whicht);
print(" ");
if (tilemnum)
{
ox+=7;
CombineTiles(-BkgndColor,whichtm,0,tsize);
DrawTile(ox,oy*8+8*(tsize==1),tsize);
sx=ox+2+2*(tsize==3);
sy=oy;
(whichtm==tilenum)?print(" No "):printhex(whichtm-tilenum);
sx-=5;
sy++;
(whichtm==tilenum)?print("Tile"):printint(whichtm-tilenum);
print(" ");
ox+=7;
CombineTiles(-ICONBACK,(whichi>lasticon)?firsticon:whichi,0,tsize);
DrawTile(ox,oy*8+8*(tsize==1),tsize);
sx=ox+2+2*(tsize==3);
sy=oy;
(whichi==tilenum)?print(" No "):printhex(whichi-tilenum);
sx-=5;
sy++;
(whichi==tilenum)?print("Icon"):printint(whichi-tilenum);
print(" ");
}
}
sx=infomaxw-11;
sy=infoy;
print("X=");
sy++;
sx-=2;
print("Y=");
sx=infomaxw-((videomode==EGA2)?19:18);
sy=infoy+1;
print("123");
if (SnapMode)
{
sx=infomaxw-((videomode==EGA2)?21:20);
sy=infoy+1;
print("S");
}
if (GridMode)
{
sx=infomaxw-((videomode==EGA2)?20:19);
sy=infoy+1;
print("G");
}
sx=infomaxw-((videomode==EGA2)?19:18);
sy=infoy;
(planeton)?print("B"):print(" ");
(planemon)?print("F"):print(" ");
(planeion)?print("I"):print(" ");
sx=infomaxw-15;
sy=infoy+1;
print("456");
sx=infomaxw-15;
sy=infoy;
(viewton)?print("b"):print(" ");
(viewmon)?print("f"):print(" ");
(viewion)?print("i"):print(" ");
if (videomode==EGA2)
{
sx=screencenterx-strlen(MapHeader.name)/2;
sy=infoy;
print(MapHeader.name);
}
DrawFloatPaste();
MouseShow();
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Initialize TED5:
//
// * Project Select if multiple projects
// * If Project has NO LEVELS:
// * Init Level 1
// * Init TILEINFO
// * Init TEDINFO file
// * Load TILES into XMS
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
char bstrings[10][15];
btype ProjButns[10];
DialogDef ProjSelect={"Select the project to work on:",
30,0,0,&ProjButns[0],DrawProjBord};
void InitTed5(void)
{
char pname[15];
unsigned i,loop,which;
MouseInit();
MouseShow();
if (!MouseStatus)
{
ErrDialog("Sorry, but TED5 will NOT\n"
"operate without a mouse!\n"," Press ENTER ");
Quit("Only REAL developers have a mouse!");
}
MouseOrigin(0,0);
ErrDialog("Initializing. One moment.","");
//
// Create bit-doubling lookup table
// for CGA font creation
//
for (loop=0;loop<256;loop++)
{
unsigned result,temp=loop;
asm mov ax,temp
asm mov ah,al
asm mov cx,8
LOOP0:
asm shl al,1
asm rcl bx,1
asm shl ah,1
asm rcl bx,1
asm loop LOOP0
asm xchg bh,bl
asm mov result,bx
doubled[loop]=result;
}
//
// Init everything!
//
InitXMS();
FindGraphFile();
LoadInfoFile();
LoadMapHeader();
RestoreBackground();
LoadGraphStuff(0,TEDInfo->lastvid);
DrawInfoBar();
DrawMap();
if (!launched && !NoAbout)
Item_About();
launched=0;
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Load the MAPTEMP.ext header in...
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
btype SelectTsizeb[]={{" 8x8 ",1,2,1},
{" 16x16 ",1,5,1},
{" 32x32 ",1,8,1}};
DialogDef SelectTsize={" Which tile size to use?"
,26,10,3,&SelectTsizeb[0],STnot};
void LoadMapHeader(void)
{
unsigned size,i,j,pflag;
char types=0;
strcpy(mapheadname,"MAPTHEAD.");
strcat(mapheadname,ext);
strcpy(mapname,"MAPTEMP.");
strcat(mapname,ext);
strcpy(SM_name,"MAPTEMP1.");
strcat(SM_name,ext);
strcpy(SM_loadname,"MAPTEMP.");
strcat(SM_loadname,ext);
if (access(mapheadname,0))
{
int i;
//
// Gotta create a new map file!
//
MMAllocate((memptr *)&MapFileHeader,sizeof(MapFileHeaderStr));
for (i=0;i<sizeof(MapFileHeaderStr);i++)
*((char _seg *)MapFileHeader+i)=0;
MapFileHeader->RLEWtag=0xabcd;
for (i=0;i<100;i++)
{
MapFileHeader->dataoffsets[i]=-1;
MapFileHeader->datalengths[i]=0;
memset(MapNames[i],0,16);
}
if (!GFXInfo->num8 &&
!GFXInfo->num8m &&
!GFXInfo->num16 &&
!GFXInfo->num16m &&
!GFXInfo->num32 &&
!GFXInfo->num32m)
{
ErrDialog("Uhh...you 'neglected' to\n"
"grab tiles to use. Running\n"
"TED5 is quite useless at\n"
"this point, I'm afraid.","Duh!");
Quit("Get some tiles ... quick! Me hungry!");
}
if (!GFXInfo->num8 &&
!GFXInfo->num16 &&
!GFXInfo->num32)
{
ErrDialog("You may have grabbed some\n"
"MASKED tiles, but I require\n"
"NON-MASKED tiles as a\n"
"minimum requirement!","Geez...");
Quit("Please grab some normal tiles!");
}
types+=(GFXInfo->num8>0)+(GFXInfo->num16>0)+(GFXInfo->num32>0);
redo:
if (types>1)
{
int which;
which=DoDialog(&SelectTsize);
switch(which)
{
case 0:
Quit("");
case 1:
if (!GFXInfo->num8)
which=0;
break;
case 2:
if (!GFXInfo->num16)
which=0;
break;
case 3:
if (!GFXInfo->num32)
which=0;
break;
}
MapFileHeader->tsize=TEDInfo->tsize=tsize=which;
}
else
{
if (GFXInfo->num8)
TEDInfo->tsize=1;
else
if (GFXInfo->num16)
TEDInfo->tsize=2;
else
if (GFXInfo->num32)
TEDInfo->tsize=3;
MapFileHeader->tsize=tsize=TEDInfo->tsize;
}
//
// pick the planes that all maps will use
//
if (PickMorePlanes())
goto redo;
//
// initialize TILEINFO/TILEINFOM
//
switch(tsize)
{
case 1:
tilenum=GFXInfo->num8;
tilemnum=GFXInfo->num8m;
break;
case 2:
tilenum=GFXInfo->num16;
tilemnum=GFXInfo->num16m;
break;
case 3:
tilenum=GFXInfo->num32;
tilemnum=GFXInfo->num32m;
}
InitTileinfo();
if (numtplanes || numtmplanes) // only input if applicable
Item_EditTinfoNames(); // void where prohibited
//
// now create a map!
//
CreateMap(0);
FigureScreenEdges();
MapFileHeader->NumIconRows=maxiconrows=InputIconAmount();
}
//
// MAP FILE ALREADY IN PLACE. LOAD STUFF IN...
//
else
{
memptr block,tempblock;
LoadIn(mapheadname,(memptr *)&MapFileHeader);
//
// See if the NumIconRows is toasty (old TED5 compatibility)
//
if (MapFileHeader->NumIconRows>50)
MapFileHeader->NumIconRows=4;
//
// has the TEDINFO?.ext file been changed?
// if so, reconstruct pertinent data...
//
if (!TEDInfo->tsize)
{
tsize=TEDInfo->tsize=MapFileHeader->tsize;
switch(tsize)
{
case 1:
tilenum=GFXInfo->num8;
tilemnum=GFXInfo->num8m;
break;
case 2:
tilenum=GFXInfo->num16;
tilemnum=GFXInfo->num16m;
break;
case 3:
tilenum=GFXInfo->num32;
tilemnum=GFXInfo->num32m;
}
}
maxiconrows=MapFileHeader->NumIconRows;
//
// Read-in all the Map Names
//
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]!=-1)
{
MapHeaderStr TempHead;
LoadFile(mapname,(char huge *)&TempHead,
MapFileHeader->dataoffsets[i],sizeof(MapHeaderStr));
strcpy(MapNames[i],TempHead.name);
}
FigureScreenEdges();
if (!TEDInfo->level)
{
for(i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]!=-1)
{
whichmap=TEDInfo->level=i;
break;
}
}
else
whichmap=TEDInfo->level;
LoadMap(TEDInfo->level);
//
// IF WE WERE LAUNCHED AND CHARACTER POSITION WAS CHANGED,
// PUT IT BACK!
//
if (launched && (TEDInfo->lastx || TEDInfo->lasty))
{
int i;
for (i=0;i<mapwidth*mapheight;i++)
if (MapInfoPl[i]==TEDInfo->permicon)
{
MapInfoPl[i]=0;
MapInfoPl[TEDInfo->lasty*mapwidth+TEDInfo->lastx]=TEDInfo->permicon;
TEDInfo->lastx=TEDInfo->lasty=0;
DirtyFlag=1;
break;
}
}
//
// POSITION SCREEN
//
xbase=TEDInfo->oscrx;
ybase=TEDInfo->oscry;
if (xbase+screenw>mapwidth)
xbase=mapwidth-screenw;
if (ybase+screenh>mapheight)
ybase=mapheight-screenh;
if (launched)
_fmemcpy((void far *)parmstring,(void far *)TEDInfo->parmstring,64);
//
// LOAD TILEINFO/M AND ADJUST IF IT CHANGED
//
numtplanes=MapFileHeader->numtplanes;
numtmplanes=MapFileHeader->numtmplanes;
pflag=0;
for (i=0;i<numtplanes;i++)
{
//
// SPACE FOR OLD TILEINFO TO DECOMPRESS INTO
//
MMAllocate(&tempblock,MapFileHeader->oldtilenum);
//
// SPACE FOR OLD TILEINFO TO LOAD INTO
//
MMAllocate(&block,MapFileHeader->tileinfolen[i]);
LoadFile(mapheadname,MK_FP(block,0),MapFileHeader->tileinfooff[i],MapFileHeader->tileinfolen[i]);
//
// DECOMPRESS FROM "BLOCK" TO "TEMPBLOCK"
//
RLEBExpand(MK_FP(block,0),MK_FP(tempblock,0),
MapFileHeader->oldtilenum,MapFileHeader->RLEWtag);
MMFreePtr(&block);
//
// ALLOCATE TINFO ARRAY
//
MMAllocate((memptr *)&Tinfo[i],tilenum);
//
// MOVE FROM "TEMPBLOCK" TO "TINFO[I]" ARRAY
//
if (MapFileHeader->oldtilenum<tilenum)
{
movedata((unsigned)tempblock,0,(unsigned)Tinfo[i],0,MapFileHeader->oldtilenum);
//
// IF NEW TILEINFO IS MORE, FILL END WITH 0s
//
for (j=MapFileHeader->oldtilenum;j<tilenum;j++)
*(Tinfo[i]+j)=0;
DirtyFlag=pflag=1;
}
else
{
movedata((unsigned)tempblock,0,(unsigned)Tinfo[i],0,tilenum);
if (MapFileHeader->oldtilenum>tilenum)
DirtyFlag=pflag=2;
}
MMFreePtr(&tempblock);
}
switch(pflag)
{
case 1:
ErrDialog("The new TILEINFO data has\n"
"been expanded to accomodate\n"
"the newly grabbed tiles."," OK ");
break;
case 2:
ErrDialog("The new TILEINFO data has\n"
"been shrunk due to a reduced\n"
"amount of tiles."," OK ");
}
pflag=0;
if (tilemnum && (MapFileHeader->maptype&FPLANE))
for (i=0;i<numtmplanes;i++)
{
MMAllocate(&tempblock,MapFileHeader->oldtilemnum);
MMAllocate(&block,MapFileHeader->tileinfomlen[i]);
LoadFile(mapheadname,MK_FP(block,0),MapFileHeader->tileinfomoff[i],MapFileHeader->tileinfomlen[i]);
RLEBExpand(MK_FP(block,0),MK_FP(tempblock,0),
MapFileHeader->oldtilemnum,MapFileHeader->RLEWtag);
MMFreePtr(&block);
MMAllocate((memptr *)&TMinfo[i],tilemnum);
if (MapFileHeader->oldtilemnum<tilemnum)
{
movedata((unsigned)tempblock,0,(unsigned)TMinfo[i],0,MapFileHeader->oldtilemnum);
for (j=MapFileHeader->oldtilemnum;j<tilemnum;j++)
*(TMinfo[i]+j)=0;
DirtyFlag=pflag=1;
}
else
{
movedata((unsigned)tempblock,0,(unsigned)TMinfo[i],0,tilemnum);
if (MapFileHeader->oldtilemnum>tilemnum)
DirtyFlag=pflag=2;
}
MMFreePtr(&tempblock);
}
switch(pflag)
{
case 1:
ErrDialog("The new TILEINFOM data has\n"
"been expanded to accomodate\n"
"the newly grabbed masked tiles."," OK ");
break;
case 2:
ErrDialog("The new TILEINFOM data has\n"
"been shrunk due to a reduced\n"
"amount of tiles."," OK ");
}
#if 0
//
// TURN ON PLANES
//
viewton=planeton=1;
if (MapFileHeader->maptype&FPLANE)
viewmon=1;
if (MapFileHeader->maptype&IPLANE)
viewion=1;
planemon=planeion=0;
#endif
}
//
// LOAD THE MAPFILE INTO XMS IF ENOUGH ROOM
//
if (1024L*XMSTotalFree()>2L*filelen(mapname) && !NoXMSFlag)
{
#define LBCSIZE 0x4000
memptr block;
long size,clen,coff;
size=filelen(mapname);
MMAllocate(&block,LBCSIZE);
XMSmaps=XMSAllocate(size);
//
// LOAD ENTIRE MAPFILE FROM DISK TO XMS!
//
coff=0;
do
{
clen=LBCSIZE;
if (size<LBCSIZE)
clen=size;
LoadFile(mapname,MK_FP(block,0),coff,clen);
XMSmove(0,(long)MK_FP(block,0),XMSmaps,coff,clen);
size-=LBCSIZE;
coff+=clen;
} while(size>0);
MMFreePtr(&block);
}
}
void STnot(int x,int y)
{
sx=x+10;
sy=y+2;
if (!GFXInfo->num8)
print("<-Not available");
else
{
printint(GFXInfo->num8);
print(" total tiles");
}
sx=x+10;
sy=y+5;
if (!GFXInfo->num16)
print("<-Not available");
else
{
printint(GFXInfo->num16);
print(" total tiles");
}
sx=x+10;
sy=y+8;
if (!GFXInfo->num32)
print("<-Not available");
else
{
printint(GFXInfo->num32);
print(" total tiles");
}
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Load the graphheader file & ?GAGRAPH.ext file and stick it in XMS!
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
int LoadGraphStuff(int rtn,video newvid)
{
#define NUMFASTDECOMP 100 // # of tiles in fast decompress buffer
char gname[14]="?GAHEAD.",gname1[14]="?GAGRAPH.",_seg *packed,_seg *unpack,
dictname[14]="?GADICT.",hufftable[1020],_seg *CacheBlock;
unsigned index,indexm,num,numm,i,realnum,realnumm,ox,oy,cacheon=0,_seg *tile_len,
_seg *tilem_len,cacheon_h;
long expsize,expmsize,xmsoff=0,unpackoff,unpackmax,unpacksize,
unpackxms;
video tempvid,pickedvid;
char huge *offsets;
strcat(gname,ext);
strcat(gname1,ext);
strcat(dictname,ext);
gname[0]=format[0];
gname1[0]=format[0];
dictname[0]=format[0];
if (!launched)
switch(format[0])
{
case 'C': pickedvid=CGA; break;
case 'E': pickedvid=EGA1; break;
case 'V': pickedvid=VGA;
}
else
pickedvid=TEDInfo->lastvid;
//
// VALIDATE GRAPHICS MODE
//
tempvid=rtn?newvid:pickedvid;
switch(tempvid)
{
case CGA:
gname[0]='C';
if (access(gname,0))
{
if (rtn)
return 0;
}
else
{
TEDInfo->lastvid=CGA;
dictname[0]=format[0]=gname1[0]='C';
setvideo(CGA);
InitDesktop(TED5MenuBar,1);
MouseShow();
break;
}
case EGA1:
case EGA2:
gname[0]='E';
if (access(gname,0))
{
if (rtn)
return 0;
}
else
{
TEDInfo->lastvid=tempvid;
dictname[0]=format[0]=gname1[0]='E';
setvideo(tempvid);
InitDesktop(TED5MenuBar,1);
MouseShow();
break;
}
case VGA:
gname[0]='V';
if (access(gname,0))
{
if (rtn)
return 0;
gname[0]=format[0];
}
else
{
TEDInfo->lastvid=VGA;
dictname[0]=format[0]=gname1[0]='V';
setvideo(VGA);
InitDesktop(TED5MenuBar,1);
MouseShow();
break;
}
}
//
// FIND HEADER & LOAD IT
//
if (access(gname,0))
{
char errstr[100]="Can't find the ";
strcat(errstr,format);
strcat(errstr,"GAHEAD.");
strcat(errstr,ext);
strcat(errstr,"\nfile! Maybe you didn't\n"
"copy it from the graphics\n"
"subdirectory?");
ErrDialog(errstr," OK ");
if (rtn)
return 0;
Quit("You're stupid! Copy the damn file!");
}
LoadIn(gname,(memptr *)&GraphHeader);
switch(MapFileHeader->tsize)
{
case 1:
index=GFXInfo->off8;
indexm=GFXInfo->off8m;
num=GFXInfo->num8;
numm=GFXInfo->num8m;
if (indexm==index+1)
{
ErrDialog("I'm sorry, but you need to\n"
"capture your 8x8 tiles\n"
"individually, and not in a\n"
"big chunk."," Alright ");
if (rtn)
return 0;
Quit("Regrab-time, bag o' shit!");
}
switch(tempvid)
{
case CGA: expsize=16; expmsize=32; break;
case EGA1:
case EGA2: expsize=32; expmsize=40; break;
case VGA: expsize=64; expmsize=128;
}
break;
case 2:
index=GFXInfo->off16;
indexm=GFXInfo->off16m;
num=GFXInfo->num16;
numm=GFXInfo->num16m;
switch(tempvid)
{
case CGA: expsize=64; expmsize=128; break;
case EGA1:
case EGA2: expsize=128; expmsize=128+32; break;
case VGA: expsize=256; expmsize=512;
}
break;
case 3:
index=GFXInfo->off32;
indexm=GFXInfo->off32m;
num=GFXInfo->num32;
numm=GFXInfo->num32m;
switch(tempvid)
{
case CGA: expsize=256; expmsize=512; break;
case EGA1:
case EGA2: expsize=512; expsize=512+4*32; break;
case VGA: expsize=1024; expmsize=2048;
}
}
//
// MOVE TILES INTO XMS MEMORY!
//
MMAllocate((memptr *)&packed,expmsize);
unpackmax=expmsize*NUMFASTDECOMP;
MMAllocate((memptr *)&unpack,unpackmax);
tilelen=expsize;
tilemlen=expmsize;
offsets=MK_FP(GraphHeader,0);
//
// LOAD DICTIONARY IN & INITIALIZE IT
//
if (!launched)
{
char _seg *block;
if (access(dictname,0))
{
char errst[200]="I can't find the \n";
strcat(errst,dictname);
strcat(errst," file!");
ErrDialog(errst," OK ");
if (rtn)
return 0;
Quit("Look in the graphics grab directory!");
}
LoadIn(dictname,(memptr *)&block);
movedata((unsigned)block,0,FP_SEG(hufftable),FP_OFF(hufftable),1020);
MMFreePtr((memptr *)&block);
OptimizeNodes((huffnode *)hufftable);
}
//
// Count up the REAL number of tiles there are!
// Build tables for tile lengths
//
MMAllocate((memptr *)&tile_len,num*2);
for (realnum=i=0;i<num;i++)
{
int j;
if (OFF3(offsets,i+index)!=0xffffff)
{
realnum++;
if (OFF3(offsets,i+index+1)!=0xffffff)
tile_len[i]=OFF3(offsets,i+index+1)-OFF3(offsets,i+index);
else
for (j=i+1;j<num+numm;j++)
if (OFF3(offsets,j+index)!=0xffffff)
{
tile_len[i]=OFF3(offsets,j+index)-OFF3(offsets,i+index);
break;
}
}
else
tile_len[i]=0;
}
MMAllocate((memptr *)&tilem_len,numm*2);
for (realnumm=i=0;i<numm;i++)
{
int j;
if (OFF3(offsets,i+indexm)!=0xffffff)
{
realnumm++;
if (OFF3(offsets,i+indexm+1)!=0xffffff)
tilem_len[i]=OFF3(offsets,i+indexm+1)-OFF3(offsets,i+indexm);
else
for (j=i+1;j<numm+1;j++)
if (OFF3(offsets,j+indexm)!=0xffffff)
{
tilem_len[i]=OFF3(offsets,j+indexm)-OFF3(offsets,i+indexm);
break;
}
}
else
tilem_len[i]=0;
}
//
// DON'T REALLOCATE THIS IF WE'RE COMING BACK FROM A LAUNCH!
//
if (!launched)
{
long size=expsize*realnum+expmsize*realnumm,savings=0;
if (1024L*XMSTotalFree()<size)
{
savings=CgaXMSsize+EgaXMSsize+VgaXMSsize;
if (1024L*XMSTotalFree()<size-savings)
{
MouseShow();
ErrDialog("Not enough memory to load\n"
"requested graphics.\n"," OK ");
MMFreePtr((memptr *)&GraphHeader);
MMFreePtr((memptr *)&packed);
MMFreePtr((memptr *)&unpack);
if (rtn)
return -1;
else
Quit("Get more Extended memory!");
}
if (CgaXMS)
{
XMSFreeMem(CgaXMS);
MMFreePtr((memptr *)&CgaXMSlookup);
}
if (EgaXMS)
{
XMSFreeMem(EgaXMS);
MMFreePtr((memptr *)&EgaXMSlookup);
}
if (VgaXMS)
{
XMSFreeMem(VgaXMS);
MMFreePtr((memptr *)&VgaXMSlookup);
}
CgaXMSsize=EgaXMSsize=VgaXMSsize=CgaXMS=EgaXMS=VgaXMS=0;
}
switch(tempvid)
{
case CGA:
xmshandle=CgaXMS=XMSAllocate(size);
CgaXMSsize=size;
break;
case EGA1:
case EGA2:
xmshandle=EgaXMS=XMSAllocate(size);
EgaXMSsize=size;
break;
case VGA:
xmshandle=VgaXMS=XMSAllocate(size);
VgaXMSsize=size;
}
ErrDialog("GRAPHICS INSTALLATION\n"
"Decompressing and\n"
"moving tiles into\n"
"Extended memory:","");
}
else
{
long size;
CgaXMS=TEDInfo->OldCgaXMS;
EgaXMS=TEDInfo->OldEgaXMS;
VgaXMS=TEDInfo->OldVgaXMS;
CgaXMSsize=TEDInfo->OldCgaXMSsize;
EgaXMSsize=TEDInfo->OldEgaXMSsize;
VgaXMSsize=TEDInfo->OldVgaXMSsize;
size=(num+numm)*4;
if (CgaXMS)
{
MMAllocate((memptr *)&CgaXMSlookup,size);
XMSmove(TEDInfo->CgaXMSlook,0,0,(long)MK_FP(CgaXMSlookup,0),size);
XMSFreeMem(TEDInfo->CgaXMSlook);
TEDInfo->CgaXMSlook=0;
}
if (EgaXMS)
{
MMAllocate((memptr *)&EgaXMSlookup,size);
XMSmove(TEDInfo->EgaXMSlook,0,0,(long)MK_FP(EgaXMSlookup,0),size);
XMSFreeMem(TEDInfo->EgaXMSlook);
TEDInfo->EgaXMSlook=0;
}
if (VgaXMS)
{
MMAllocate((memptr *)&VgaXMSlookup,size);
XMSmove(TEDInfo->VgaXMSlook,0,0,(long)MK_FP(VgaXMSlookup,0),size);
XMSFreeMem(TEDInfo->VgaXMSlook);
TEDInfo->VgaXMSlook=0;
}
switch(tempvid)
{
case CGA:
xmshandle=CgaXMS;
XMSlookup=CgaXMSlookup;
break;
case EGA1:
case EGA2:
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
break;
case VGA:
xmshandle=VgaXMS;
XMSlookup=VgaXMSlookup;
}
ErrDialog("RE-INITIALIZING...","");
}
ox=sx;
oy=sy;
//
// INSTALL GRAPHICS IF NOT A LAUNCH...
//
if (!launched)
{
switch(tempvid)
{
case CGA:
MMAllocate((memptr *)&CgaXMSlookup,(num+numm)*4);
XMSlookup=CgaXMSlookup;
break;
case EGA1:
case EGA2:
MMAllocate((memptr *)&EgaXMSlookup,(num+numm)*4);
XMSlookup=EgaXMSlookup;
break;
case VGA:
MMAllocate((memptr *)&VgaXMSlookup,(num+numm)*4);
XMSlookup=VgaXMSlookup;
}
//
// SET UP MEMORY CACHE IF ENOUGH IS AVAILABLE...
//
cacheon_h=0;
if (filelen(gname1)<16L*MMTotalFree())
{
LoadIn(gname1,(memptr *)&CacheBlock);
cacheon=1;
}
else
//
// DAMN! TRY XMS AS A LAST RESORT...
//
if (filelen(gname1)<1024l*XMSTotalFree())
{
#define TMPBUFSIZE 32000l
long amtleft,tmpoff=0,tmpsize;
memptr tblock;
amtleft=filelen(gname1);
MMAllocate(&tblock,TMPBUFSIZE);
cacheon_h=XMSAllocate(amtleft);
tmpsize=TMPBUFSIZE;
while(amtleft>0)
{
LoadFile(gname1,MK_FP(tblock,0),tmpoff,tmpsize);
XMSmove(0,(long)MK_FP(tblock,0),cacheon_h,tmpoff,tmpsize);
amtleft-=TMPBUFSIZE;
tmpoff+=TMPBUFSIZE;
tmpsize=(amtleft>TMPBUFSIZE)?TMPBUFSIZE:amtleft;
}
MMFreePtr(&tblock);
cacheon=2;
}
clearkeys();
//
// MOVE NONMASKED TILES INTO XMS MEMORY!
// ---------
unpacksize=unpackoff=0;
unpackxms=xmsoff;
for (i=0;i<num;i++)
{
long size,off;
off=OFF3(offsets,index+i);
if (off==0xffffff) // SPARSE TILE?
{
*(XMSlookup+i)=-1;
continue;
}
size=tile_len[i];
//
// GET COMPRESSED TILE DATA FROM CACHE OR DISK
//
if (cacheon==1)
{
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)CacheBlock+off,(unsigned char huge *)unpack+unpackoff,
expsize,(huffnode *)hufftable);
}
else
if (cacheon==2)
{
XMSmove(cacheon_h,off,0,(long)packed,size);
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
expsize,(huffnode *)hufftable);
}
else
{
LoadFile(gname1,(char huge *)packed,off,size);
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
expsize,(huffnode *)hufftable);
}
unpacksize+=expsize;
unpackoff+=expsize;
*(XMSlookup+i)=xmsoff;
xmsoff+=expsize;
if (unpacksize>unpackmax-expsize)
{
XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize);
unpacksize=unpackoff=0;
unpackxms=xmsoff;
sx=ox;
sy=oy;
printint(num+numm-i);
print(" ");
}
//
// ESC will exit!
//
if (keydown[1])
if (rtn)
{
switch(tempvid)
{
case CGA:
XMSFreeMem(CgaXMS);
MMFreePtr((memptr *)&CgaXMSlookup);
CgaXMS=0;
break;
case EGA1:
case EGA2:
XMSFreeMem(EgaXMS);
MMFreePtr((memptr *)&EgaXMSlookup);
EgaXMS=0;
break;
case VGA:
XMSFreeMem(VgaXMS);
MMFreePtr((memptr *)&VgaXMSlookup);
VgaXMS=0;
}
switch(videomode)
{
case CGA:
xmshandle=CgaXMS;
XMSlookup=CgaXMSlookup;
break;
case EGA1:
case EGA2:
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
break;
case VGA:
xmshandle=VgaXMS;
XMSlookup=VgaXMSlookup;
}
MMFreePtr((memptr *)&GraphHeader);
MMFreePtr((memptr *)&packed);
MMFreePtr((memptr *)&unpack);
if (cacheon)
MMFreePtr((memptr *)&CacheBlock);
return 0;
}
else
Quit("XMS LOADING ABORTED!");
}
//
// FLUSH THE FAST(?)-CACHE
//
if (unpacksize)
{
XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize);
unpacksize=unpackoff=0;
unpackxms=xmsoff;
}
//
// MOVE MASKED TILES INTO XMS MEMORY!
// ------
for (i=0;i<numm;i++)
{
long size,off;
off=OFF3(offsets,indexm+i);
if (off==0xffffff) // SPARSE TILE?
{
*(XMSlookup+i+num)=-1;
continue;
}
size=tilem_len[i];
//
// GET COMPRESSED TILE DATA FROM CACHE OR DISK
//
if (cacheon==1)
{
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)CacheBlock+off,(unsigned char huge *)unpack+unpackoff,
expmsize,(huffnode *)hufftable);
}
else
if (cacheon==2)
{
XMSmove(cacheon_h,off,0,(long)packed,size);
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
expmsize,(huffnode *)hufftable);
}
else
{
LoadFile(gname1,(char huge *)packed,off,size);
//
// HUFFMAN DECOMPRESS
//
HuffExpand((unsigned char huge *)packed,(unsigned char huge *)unpack+unpackoff,
expmsize,(huffnode *)hufftable);
}
unpacksize+=expmsize;
unpackoff+=expmsize;
*(XMSlookup+i+num)=xmsoff;
xmsoff+=expmsize;
if (unpacksize>unpackmax-expmsize)
{
XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize);
unpacksize=unpackoff=0;
unpackxms=xmsoff;
sx=ox;
sy=oy;
printint(numm-i);
print(" ");
}
//
// ESC will exit!
//
if (keydown[1])
if (rtn)
{
switch(tempvid)
{
case CGA:
XMSFreeMem(CgaXMS);
MMFreePtr((memptr *)&CgaXMSlookup);
CgaXMS=0;
break;
case EGA1:
case EGA2:
XMSFreeMem(EgaXMS);
MMFreePtr((memptr *)&EgaXMSlookup);
EgaXMS=0;
break;
case VGA:
XMSFreeMem(VgaXMS);
MMFreePtr((memptr *)&VgaXMSlookup);
VgaXMS=0;
}
switch(videomode)
{
case CGA:
xmshandle=CgaXMS;
XMSlookup=CgaXMSlookup;
break;
case EGA1:
case EGA2:
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
break;
case VGA:
xmshandle=VgaXMS;
XMSlookup=VgaXMSlookup;
}
MMFreePtr((memptr *)&GraphHeader);
MMFreePtr((memptr *)&packed);
MMFreePtr((memptr *)&unpack);
if (cacheon)
MMFreePtr((memptr *)&CacheBlock);
return 0;
}
else
Quit("XMS LOADING ABORTED!");
}
//
// FLUSH THE FAST-CACHE
//
if (unpacksize)
{
XMSmove(0,(long)MK_FP(unpack,0),xmshandle,unpackxms,unpacksize);
unpacksize=unpackoff=0;
unpackxms=xmsoff;
}
if (cacheon==1)
MMFreePtr((memptr *)&CacheBlock);
else
if (cacheon==2)
XMSFreeMem(cacheon_h);
}
//
// GET RID OF TILE-FILE CACHE MEMORY (OR WE'RE TOASTY)
//
MMFreePtr((memptr *)&GraphHeader);
MMFreePtr((memptr *)&packed);
MMFreePtr((memptr *)&unpack);
MMFreePtr((memptr *)&tile_len);
MMFreePtr((memptr *)&tilem_len);
whicht=0;
whichi=tilenum;
whichtm=tilenum;
switch(tsize)
{
case 1: lasticon=tilenum+36*maxiconrows;
break;
case 2: lasticon=tilenum+18*maxiconrows;
break;
case 3: lasticon=tilenum+7*maxiconrows;
}
firsticon=tilenum;
RestoreBackground();
return 1;
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Load TEDINFO.ext file
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
void LoadInfoFile(void)
{
char pname[14]="TEDINFO.",gfxname[14]="GFXINFO";
//
// Load the TEDINFO.ext file!
//
strcat(pname,ext);
strcpy(infoname,pname);
if (access(pname,0))
{
MMAllocate((memptr *)&TEDInfo,sizeof(InfoStruct));
_fmemset(TEDInfo,0,sizeof(InfoStruct));
// BFI BFI
TEDInfo->pflags=0x27; // 0010 0111
}
else
LoadIn(pname,(memptr *)&TEDInfo);
tsize=TEDInfo->tsize;
if (launchname[0])
_fmemcpy((char far *)TEDInfo->launchname,(char far *)launchname,14);
//
// LOAD THE "GFXINFO?.EXT" FILE
//
strcat(gfxname,format);
strcat(gfxname,".");
strcat(gfxname,ext);
LoadIn(gfxname,(memptr *)&GFXInfo);
switch(tsize)
{
case 1:
tilenum=GFXInfo->num8;
tilemnum=GFXInfo->num8m;
break;
case 2:
tilenum=GFXInfo->num16;
tilemnum=GFXInfo->num16m;
break;
case 3:
tilenum=GFXInfo->num32;
tilemnum=GFXInfo->num32m;
}
_fstrcpy((char far *)launchname,(char far *)TEDInfo->launchname);
if (launched)
TEDInfo->lastvid=LaunchInfo.lastmode;
//
// SET PLANE FLAGS BACK TO NORMAL
//
planeton=(TEDInfo->pflags>>6)&1;
planemon=(TEDInfo->pflags>>5)&1;
planeion=(TEDInfo->pflags>>4)&1;
viewton=(TEDInfo->pflags>>2)&1;
viewmon=(TEDInfo->pflags>>1)&1;
viewion=(TEDInfo->pflags)&1;
//
// SET BACKGROUND COLOR
//
BkgndColor=TEDInfo->BackgndColor;
if (BkgndColor>16)
TEDInfo->BackgndColor=BkgndColor=O_FGNDBACK;
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Find ?GAGRAPH.ext file
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
void FindGraphFile(void)
{
struct ffblk ffblk;
char pname[15]="?GAGRAPH.*",*tempstr,tiname[13]="TEDINFO.TMP";
int i,which;
//
// RETURNING FROM LAUNCH...GET INFO BACK
//
if (launched)
{
LoadFile(tiname,(char huge *)&LaunchInfo,0,0);
unlink(tiname);
videomode=LaunchInfo.lastmode;
switch(videomode)
{
case CGA:
format[0]='C';
break;
case EGA1:
case EGA2:
format[0]='E';
break;
case VGA:
format[0]='V';
}
strcpy(ext,LaunchInfo.ext);
projname[0]=format[0];
strcat(projname,"GAGRAPH.");
strcat(projname,ext);
return;
}
//
// Find ?GAGRAPH.ext
//
if (ext[0])
{
strcpy(pname,"?GAGRAPH.");
strcat(pname,ext);
}
if (findfirst(pname,&ffblk,FA_ARCH))
{
ErrDialog("I can't find a graphics\nfile! (ex:?GAGRAPH.ext)"," Alright ");
Quit("Can't work without graphics ya know!");
}
if (GfxToUse)
format[0] = GfxToUse;
else
{
// setup the dialog
strcpy(bstrings[0],ffblk.ff_name);
ProjButns[0].xoff=9;
ProjButns[0].yoff=2;
ProjButns[0].border=0;
ProjButns[0].text=bstrings[0];
for (i=1;i<10;i++)
{
if (findnext(&ffblk))
break;
strcpy(bstrings[i],ffblk.ff_name);
ProjButns[i].xoff=9;
ProjButns[i].yoff=2+i;
ProjButns[i].border=0;
ProjButns[i].text=bstrings[i];
}
ProjSelect.numbuttons=i;
ProjSelect.height=i+3;
which=1;
if (i>1)
do
{
which=DoDialog(&ProjSelect);
} while(!which);
which--;
tempstr=strpbrk(bstrings[which],".")+1;
strcpy(ext,tempstr);
format[0]=bstrings[which][0];
}
strcpy(projname,bstrings[which]);
}
//
// draw border for project window
//
void DrawProjBord(int x,int y)
{
DrawBorder(x+8,y+1,13,ProjSelect.height-2,1);
}
////////////////////////////////////////////////////
//
// Input amount of icons to reserve
// Returns maximum # of icon rows to reserve
//
////////////////////////////////////////////////////
btype ICb={" ",8,3,1};
DialogDef ICd={"Enter maximum amount\nof icons to reserve:",20,5,1,&ICb,NULL};
int InputIconAmount(void)
{
char tempstr[4];
int value;
if (!(MapFileHeader->maptype&IPLANE))
return 4;
MouseHide();
DrawDialog(&ICd,1);
while(1)
{
GetDialogXY(&ICd,&sx,&sy);
GetButtonXY(&ICd,0,&sx,&sy);
if (input(tempstr,3))
{
value=atoi(tempstr);
if (value>0)
{
MouseShow();
RestoreBackground();
return (value+17)/18;
}
}
}
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Unhook everything
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
void Unhook(void)
{
ShutdownKBD();
if (CgaXMS)
XMSFreeMem(CgaXMS);
if (EgaXMS)
XMSFreeMem(EgaXMS);
if (VgaXMS)
XMSFreeMem(VgaXMS);
if (XMSundoB)
XMSFreeMem(XMSundoB);
if (XMSundoF)
XMSFreeMem(XMSundoF);
if (XMSundoI)
XMSFreeMem(XMSundoI);
if (XMSmaps)
XMSFreeMem(XMSmaps);
}
void PatchPointers(void)
{
}
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// Menu Definitions
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
MenuDef AboutMenu[]=
{{"About...",Item_About,0,0},
{"Video Mode Switch",Item_ModeSwitch,0,0x43},
{"Last Video Mode",Item_LastVideo,ALT,0x2c},
{"Memory Available",Item_PrintMem,0,0x44},
{"Launch Project",Item_Launch,ALT,0x26},
{"--------------------",NULL,0,0},
// {"Display Unused Tiles",Item_CountTiles,0,0},
{"Project Re-Select",Item_ProjectReSelect,0,0},
{"Visit DOS",Item_VisitDOS,0,0}
};
MenuDef FileMenu[]=
{{"Edit New Map",Item_EditMap,ALT,0x18},
{"Save Map",Item_SaveMap,ALT,0x1f},
{"Create Map",Item_CreateMap,ALT,0x2e},
{"Delete Map",Item_DeleteMap,ALT,0x20},
{"Switch Map",Item_SwitchMap,ALT,0x11},
{"Amputate Maps",Item_Amputate},
{"---------------",NULL,0,0},
{"Import Maps",Item_ImportMaps,0,0},
{"Change ICON Rows",Item_ChangeIconRows,0,0},
{"Carmacize Maps",Item_Huffman,0,0},
{"Quit TED5",Item_Quit,ALT,0x2d}};
MenuDef EditMenu[]=
{{"Switch to Last Map",Item_LastMap,ALT,0x32},
{"Edit TILEINFO/M Values",Item_EditTinfoValues,ALT,0x14},
{"Change LAUNCH name",Item_LAUNCHname,0,0},
{"Change PARM string",Item_PARMstring,0,0},
{"Edit TILEINFO/M Names",Item_EditTinfoNames,0,0},
{"Add/Del TILEINFO/M Planes",Item_AddDelTinfo,0,0},
{"Edit MAP Names",Item_EditMapNames,0,0},
{"Change MAP Edges",Item_EditMapEdges,0,0}};
MenuDef ModeMenu[]=
{
{"Copy Mode",Item_Copy,0,0x2e},
{"Paste Mode",Item_Paste,0,0x19},
{"Block Fill",Item_BlockFill,0,0x30},
{"Flood Fill",Item_FloodFill,0,0x21},
{"Undo last action",Item_Undo,0,0x16},
{"Tile Search",Item_TileSearch,0,0x14},
{"GridMode toggle",Item_GridMode,0,0x22},
{"Snap-Paste toggle",Item_SnapTog,0,0x1f},
{"Paste Overlay toggle",Item_POtog,0,0x3d}
};
MenuDef MiscMenu[]=
{
{"Select Tile",Item_SelectTile,0,0x39},
{"Map Stats",Item_MapStats,0,0x17},
{"Toggle INFOBAR",Item_ToggleInfo,0,0x42},
{"New INFOPLANE value",Item_InputInfoplane,0,0x1c},
{"View Map & Goto",Item_ViewMap,ALT,0x2f},
{"ReView Map & Goto",Item_ReviewMap,0,0xe},
{"Change LAUNCH icon",Item_ChangeLaunchIcon,0,0},
{"Change bkgnd color",Item_ChangeBkgndColor,0,0},
{"TILEINFOM Copy",Item_TINFOCopy,0,0},
{"Graphic Map Dump",Item_GraphicDump,0,0}
};
MBarDef TED5MenuBar[]=
{{9,AboutMenu," ? "},
{11,FileMenu,"File"},
{8,EditMenu,"Edit"},
{9,ModeMenu,"Modes"},
{10,MiscMenu,"Misc"},
{0,0,""}};